总结
wc-l/--lines: 行数-w/--words: 词数-c/--bytes: 字节数-m/--chars: 字符数- 字符集和字符编码
utf-8、utf-16、utf-32
提问
[x] 1. 如何显示某个文件的行数
wc -l [ file ][x] 2. 某个文件字符数及字节数有何区别
- 字节: 存储单位
- 字符: 数字、字母、符号或中文。
1 个英文字符为
1字节,以UTF-8表示时,1 个汉字字符为3 ~ 4字节
1. 前提提要、场景
- 文本内容正则匹配:
grep - 文本内容排序:
sort
如果想要统计文本内容行数、词数、字节数,可以使用 wc (word count) 的缩写
2. wc 统计文本内容行数、词数、字节数
$ wc package.json
# 行 词数 字节数 文件名
153 458 7432 package.json
# -l:--lines 行数
$ wc -l package.json
153 package.json
# 如果仅仅想显示行数
$ cat package.json | wc -l
153
# -w:--words 词数
$ wc -w package.json
458 package.json
# -m:--chars 字符数
$ wc -m package.json
7432 package.json
# -c:--bytes 字节数
$ wc -c package.json
7432 package.json
3. 字节数和字符数
每个英文字符占 1 字节,以 utf-8 表示时,每个汉字字符占 3 ~ 4 字节。
# 1 个 字符
# -n: 不输出尾部的换行符
$ echo -n 好 | wc -m
1
# 3 个 字节
$ echo -n 好 | wc -c
3
4. 字符集和字符编码
4.1 字符集
字符集是很多个字符的集合
早期,制定了适用于英语字符的 ASCII 字符集。一共定义了 128 个字符。
随着发展,各个国家出现了更多字符集,大陆的 GB2312、港台的 BIG5
这便出现了个问题:一个网页文件有中英文,便至少要两套字符集去编码解析。如果再多些表情符号和数学公式...,需要加载太多套字符集了
为了在互联网有一套完整的字节集,定义世界各种语言的每个字符,便有了 Unicode 字符集。共定义了一百多万个字符。
字符集:
ASCII: 英语字符集(字母、数字、英语符号)。每个字符1个字节,共定义了128个字符(0x00 - 0x7F)。GB2312: 大陆的简体字符集,2字节BIG5: 港台的繁体字符集,2字节GBK: 集合了简体字和繁体字的字符集,2字节Unicode: 国际标准字符集,为世界各种语言的每个字符定义一个唯一的编码。utf-8编码中,每个字符1 ~ 4个字节,共定义了一百多万个字符(0x0000 - 0x10FFFF)
ASCII只用了7位128个字符,是因为最高位用来做网络传输的奇偶校验了。
奇偶校验:1的个数为奇数,最高位为1,偶数则为0
4.2 字符编码
字符集是很多个字符的集合,而将字符集转换为字节或字节序列,以便在计算机中存储和通信网络中传输,这便需要字符编码。
ASCII、GB2312、GBK等: 都是即表示了字符集,又表示了对应的字符编码,可以视为同义词Unicode: 采用现代的模型,Unicode字符集有多种字符编码。如utf-8、utf-16、utf-32
也可以将字符集理解为规范,而字符编码是规范的实现。
4.3 utf-32
Unicode 字符集,每个字符最多占用 4 个字节。规范有了,但是要怎么去实现存储呢?
最简单的方式就是每个字符按最大占用算,直接每个字符都用 4 个字节存储。这是最简单的实现方式。
优点是编码速度很快,缺点是太占用空间了。
4.4 utf-8
为了避免浪费空间,便需要一种可变长度字符编码 utf-8
ASCII 的每个字符占用 1 个字节,是固定字节数。
但 utf-8 每个字符占用 1 ~ 4 字节,非固定字节数。非固定字节数就需要有标志,去作为字符与字符之间的区分。
utf-8 有个取巧的设计:
- 如果该字节第一位为
0,这个字节单独为字符。 - 如果该字节从第一位开始,连续有
n个1,则字符占用n个字节。
可以在Unicode To UTF8 中查看他们的二进制编码
A:01000001。1 字节ĕ:11000100|10010101。2 字节好:11100101|10100101|10111101。3 字节🚀:11110000|10011111|10011010|10000000。4 字节
Unicode 中 utf-8 占用字节:
- 1 个字节:涵盖英语字符集。前
128个字符,与ASCII编码相同,可以理解为utf-8兼容了ASCII。 - 2 个字节:涵盖了几乎所有拉丁字母的其余部分,还包括希腊语等等。
- 3 个字节:涵盖了中文、日文、韩文,包含了
GBK。 - 4 个字节:涵盖了表情符号、数学符号、扩展的非常用汉字等
可以看出来,在 GBK 中,中文只需要 2 字节。 urf-8 中由于需要字符数标志符,中文需要 3 字节。理论上如果内容只有中文,使用 GBK 更节省空间,但在实际网络中,中英文混用,甚至还有表情符号和数学公式,用 Unicode 的 utf-8 更省事。
utf-8 节省了空间,兼容了 ASCII ,但编码复杂了一些。
4.5 utf-16
utf-16 也是一种可变长编码,全都占用 2 字节,在纯英文上,存储能力比 utf-8 弱,但在中文或者更复杂的场景,存储能力比 utf-8 强。
优点:不需要字符标志,存储效率更高、执行索引操作时速度很快。
缺点:Unicode 5.0 已经收录快 10 万个字符了,而 utf-16 只有 6 万个字符,也需要扩展字节。容错性低。大小端字节序问题。
原理未梳理,有懂的大佬帮我捋一捋